package struts2.sample07.action;

import java.util.LinkedList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.struts2.config.Result;
import org.apache.struts2.config.Results;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.springframework.beans.BeanUtils;

import struts2.sample07.mapping.DevilType;

@Results({
	@Result(name="search", value="deviltype_search.jsp"),
	@Result(name="create", value="deviltype_create.jsp"),
	@Result(name="refer" , value="deviltype_refer.jsp"),
	@Result(name="update", value="deviltype_update.jsp")
})
public class DevilTypeMasterAction {
	
	/** 検索条件：種族名称 */
	private String devilTypeName;

	/** 検索結果 */
	private List<DevilType> searchResults;

	/** 新規登録・更新・削除・参照：悪魔種族 */
	private DevilType devilType;

	/** hibernateのセッションファクトリー */
	private SessionFactory sessionFactory;

	
	/**
	 * 検索の初期表示メソッド。
	 */
	public String searchInit() {
		return "search";
	}
	
	
	
	/**
	 * 検索メソッド。
	 */
	@SuppressWarnings({ "unchecked" })
	public String search(){
		searchResults = new LinkedList();
		Session dbSession = sessionFactory.openSession();
		try{
			// 検索条件オブジェクト
			Criteria criteria = dbSession.createCriteria(DevilType.class);
			criteria.addOrder(Order.asc("id"));
			// devilTypeNameが入力されてたら検索条件に追加（部分一致）
			if(StringUtils.isNotEmpty(devilTypeName))
				criteria.add(Expression.like(
						"name", devilTypeName, MatchMode.ANYWHERE));
			// 検索実行
			List<DevilType> list = criteria.list();
			
			searchResults.addAll(list);
		}finally{
			dbSession.close();
		}
		
		return "search";
	}



	/**
	 * 新規登録の初期表示メソッド
	 */
	public String createInit(){
		// プロパティを初期化
		devilType = new DevilType();

		return "create";
	}

	
	
	/**
	 * 新規登録メソッド
	 */
	public String create(){
		Session dbSession = sessionFactory.openSession();
		try{
			Transaction transaction = dbSession.beginTransaction();
			dbSession.save(devilType);
			transaction.commit();
		}finally{
			dbSession.close();
		}
		
		return "create";
	}
	

	
	/**
	 * 更新の初期表示メソッド
	 */
	public String updateInit(){
		Session dbSession = sessionFactory.openSession();
		
		// データベースからデータを取得
		try{
			dbSession.load(devilType, devilType.getId());
		}finally{
			dbSession.close();
		}
		
		return "update";
	}

	
	
	/**
	 * 更新メソッド
	 */
	public String update(){
		Session dbSession = sessionFactory.openSession();
		
		try{
			// トランザクション開始
			Transaction transaction = dbSession.beginTransaction();
			// データベースからエンティティを持ってくる
			DevilType entity = (DevilType)dbSession.load(
					DevilType.class, devilType.getId());
			// プロパティをコピー
			BeanUtils.copyProperties(devilType, entity);
			// コミット
			transaction.commit();
		}finally{
			dbSession.close();
		}
		
		
		return "update";
	}
	

	
	/**
	 * 削除メソッド
	 */
	public String delete(){
		Session dbSession = sessionFactory.openSession();
		
		try{
			// トランザクション開始
			Transaction transaction = dbSession.beginTransaction();
			// データベースからエンティティを持ってくる
			DevilType entity = (DevilType)dbSession.load(
					DevilType.class, devilType.getId());
			// 持ってきたエンティティを削除する
			dbSession.delete(entity);
			// コミット
			transaction.commit();
		}finally{
			dbSession.close();
		}
		
		return "search";
	}
	

	
	/**
	 * 参照メソッド
	 */
	public String refer(){
		Session dbSession = sessionFactory.openSession();
		
		// データベースから利用者情報を取得
		try{
			dbSession.load(devilType, devilType.getId());
		}finally{
			dbSession.close();
		}
		
		return "refer";
	}



	//
	// setterとgetter
	//
	
	public DevilType getDevilType() {
		return devilType;
	}

	public void setDevilType(DevilType devilType) {
		this.devilType = devilType;
	}

	public String getDevilTypeName() {
		return devilTypeName;
	}

	public void setDevilTypeName(String devilTypeName) {
		this.devilTypeName = devilTypeName;
	}

	public List getSearchResults() {
		return searchResults;
	}

	public void setSearchResults(List searchResults) {
		this.searchResults = searchResults;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
}
